/* Copyright 2001,2002,2003 NAH6 BV
 * All Rights Reserved
 *
 *  $Header: /var/lib/cvs/secphone/ui/controls/Label.cpp,v 1.5 2003/11/21 12:39:24 itsme Exp $
 *
 *
 * this module is based on
 * see http://www.codeproject.com/staticctrl/clabel.asp
 * or http://codeguru.earthweb.com/staticctrl/label_static.shtml
 *
 * it implements a static text, whose font and color can be set easily
 *
 * one remaining problem, is that I don't know how to make it display 
 * text transparently over the background.
 *
 * the newer version that can be found on the net, does this without
 * problems on win32 desktop, but will not work under Windows CE
 *
 */

#include "stdafx.h"

#include "Resource.h"
#include "Label.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CLabel

CLabel::CLabel()
{
    m_crText = GetSysColor(COLOR_WINDOWTEXT);
    m_hBrush = ::CreateSolidBrush(GetSysColor(COLOR_3DFACE));

    ::GetObject((HFONT)GetStockObject(SYSTEM_FONT),sizeof(m_lf),&m_lf);

    m_font.CreateFontIndirect(&m_lf);
    m_bTimer = FALSE;
    m_bState = FALSE;
    m_bLink = TRUE;
    m_hCursor = NULL;
    m_Type = None;

    m_hwndBrush = ::CreateSolidBrush(GetSysColor(COLOR_3DFACE));
}


CLabel::~CLabel()
{
    m_font.DeleteObject();
    ::DeleteObject(m_hBrush);
}

CLabel& CLabel::SetText(const CString& strText)
{
    SetWindowText(strText);
    return *this;
}

CLabel& CLabel::SetTextColor(COLORREF crText)
{
    m_crText = crText;
    RedrawWindow();
    return *this;
}

CLabel& CLabel::SetFontBold(BOOL bBold)
{
    m_lf.lfWeight = bBold ? FW_BOLD : FW_NORMAL;
    ReconstructFont();
    RedrawWindow();
    return *this;
}

CLabel& CLabel::SetFontUnderline(BOOL bSet)
{
    m_lf.lfUnderline = bSet;
    ReconstructFont();
    RedrawWindow();
    return *this;
}

CLabel& CLabel::SetFontItalic(BOOL bSet)
{
    m_lf.lfItalic = bSet;
    ReconstructFont();
    RedrawWindow();
    return *this;
}

CLabel& CLabel::SetSunken(BOOL bSet)
{
    if (!bSet)
        ModifyStyleEx(WS_EX_STATICEDGE,0,SWP_DRAWFRAME);
    else
        ModifyStyleEx(0,WS_EX_STATICEDGE,SWP_DRAWFRAME);

    return *this;
}

CLabel& CLabel::SetBorder(BOOL bSet)
{
    if (!bSet)
        ModifyStyle(WS_BORDER,0,SWP_DRAWFRAME);
    else
        ModifyStyle(0,WS_BORDER,SWP_DRAWFRAME);

    return *this;
}

CLabel& CLabel::SetFontSize(int nSize)
{
    nSize*=-1;
    m_lf.lfHeight = nSize;
    ReconstructFont();
    RedrawWindow();
    return *this;
}


CLabel& CLabel::SetBkColor(COLORREF crBkgnd)
{
    if (m_hBrush)
        ::DeleteObject(m_hBrush);

    m_hBrush = ::CreateSolidBrush(crBkgnd);
    return *this;
}

CLabel& CLabel::SetFontName(const CString& strFont)
{
    _tcscpy(m_lf.lfFaceName,strFont);
    ReconstructFont();
    RedrawWindow();
    return *this;
}


BEGIN_MESSAGE_MAP(CLabel, CStatic)
    //{{AFX_MSG_MAP(CLabel)
    ON_WM_CTLCOLOR_REFLECT()
    ON_WM_TIMER()
    ON_WM_LBUTTONDOWN()
    ON_WM_SETCURSOR()
    //}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CLabel message handlers

HBRUSH CLabel::CtlColor(CDC* pDC, UINT nCtlColor)
{
    // TODO: Change any attributes of the DC here
    // TODO: Return a non-NULL brush if the parent's handler should not be called

    if (CTLCOLOR_STATIC == nCtlColor)
    {
        pDC->SelectObject(&m_font);
        pDC->SetTextColor(m_crText);
        pDC->SetBkMode(TRANSPARENT);
    }


    if (m_Type == Background)
    {
        if (!m_bState)
            return m_hwndBrush;
    }

    return m_hBrush;
}

void CLabel::ReconstructFont()
{
    m_font.DeleteObject();
    BOOL bCreated = m_font.CreateFontIndirect(&m_lf);

    ASSERT(bCreated);
}


CLabel& CLabel::FlashText(BOOL bActivate)
{
    if (m_bTimer)
    {
        SetWindowText(m_strText);
        KillTimer(1);
    }

    if (bActivate)
    {
        GetWindowText(m_strText);
        m_bState = FALSE;

        m_bTimer = TRUE;
        SetTimer(1,500,NULL);
        m_Type = Text;
    }

    return *this;
}

CLabel& CLabel::FlashBackground(BOOL bActivate)
{

    if (m_bTimer)
        KillTimer(1);

    if (bActivate)
    {
        m_bState = FALSE;

        m_bTimer = TRUE;
        SetTimer(1,500,NULL);

        m_Type = Background;
    }

    return *this;
}


void CLabel::OnTimer(UINT nIDEvent)
{
    m_bState = !m_bState;

    switch (m_Type)
    {
        case Text:
            if (m_bState)
                SetWindowText(L"");
            else
                SetWindowText(m_strText);
        break;

        case Background:
            InvalidateRect(NULL,FALSE);
            UpdateWindow();
        break;
    }

    CStatic::OnTimer(nIDEvent);
}

CLabel& CLabel::SetLink(BOOL bLink)
{
    m_bLink = bLink;

    if (bLink)
        ModifyStyle(0,SS_NOTIFY);
    else
        ModifyStyle(SS_NOTIFY,0);

    return *this;
}

void CLabel::OnLButtonDown(UINT nFlags, CPoint point)
{
//  CString strLink;

//  GetWindowText(strLink);
//  ShellExecute(NULL,"open",strLink,NULL,NULL,SW_SHOWNORMAL);

    CStatic::OnLButtonDown(nFlags, point);
}

BOOL CLabel::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)
{
    if (m_hCursor)
    {
        ::SetCursor(m_hCursor);
        return TRUE;
    }

    return CStatic::OnSetCursor(pWnd, nHitTest, message);
}

CLabel& CLabel::SetLinkCursor(HCURSOR hCursor)
{
    m_hCursor = hCursor;
    return *this;
}
